define(function(require) {

    var aop = {

        /**
         * 执行前切入方法
         *
         * @param classN 类名
         * @param methodN 原型方法名（既可以传字符串，也可以传数组）
         * @param fn 需要切入的事件
         * @returns 
         */
        before: function(classN, methodN, fn) {
            var _classPrototype = (typeof(classN) === 'function' ? classN.prototype : this.getClassPrototype(classN));
            var _methods = [];
            if (this.isArray(methodN)) {
                _methods = methodN;
            } else {
                _methods.push(methodN);
            }

            for (var i = 0; i < _methods.length; i++) {
                var _method_name = _methods[i];
                var _method_func = _classPrototype[_method_name];

                return function(mn, mf) {
                    _classPrototype[mn] = function() {
                        fn.apply(this, arguments);
                        mf.apply(this, arguments);
                    }
                }(_method_name, _method_func);
            }
        },

        /**
         * 执行后切入方法
         *
         * @param classN 类名
         * @param methodN 原型方法名（既可以传字符串，也可以传数组）
         * @param fn 需要切入的事件
         * @returns 
         */
        after: function(classN, methodN, fn) {
            var _classPrototype = (typeof(classN) === 'function' ? classN.prototype : this.getClassPrototype(classN));
            var _methods = [];
            if (this.isArray(methodN)) {
                _methods = methodN;
            } else {
                _methods.push(methodN);
            }

            for (var i = 0; i < _methods.length; i++) {
                var _method_name = _methods[i];
                var _method_func = _classPrototype[_method_name];

                return function(mn, mf) {
                    _classPrototype[mn] = function() {
                        mf.apply(this, arguments);
                        fn.apply(this, arguments);
                    }
                }(_method_name, _method_func);
            }
        },

        /**
         * 获取类的prototype
         * @param  {[type]} className [description]
         * @return {[type]}           [description]
         */
        getClassPrototype: function(className) {
            // 其他模块引用的对象将作为属性统一放到_module中
            var _module = {
                commonLib: require('./commonLib'),
                manualTimeTable: require('../manualTimeTable'),
                jxbTimeTable: require('./jxbTimeTable'),
                jxbTimeItem: require('./jxbTimeItem')
            };

            var _className = className;
            if (_className.indexOf('/') !== -1) {
                _className = _className.substring(_className.lastIndexOf('/') + 1, _className.length);
            }

            if (typeof _module[_className] !== 'undefined') {
                return _module[_className].prototype;
            }
            try {
                return eval(className).prototype;
            } catch (e) {
                console.warn('没有找到' + className + '对象');
            }
        },

        /**
         * 判断对象是否为数组
         * @param 对象
         * @returns true/false
         */
        isArray: function(obj) {
            return Object.prototype.toString.call(obj) === '[object Array]';
        }
    };

    return aop;

});
